public class BM {

    /**
     * 
     * @param c 源串中字符
     * @param s 目标串
     * @return 返回平移距离
     */
    public static int path(char c , char[] s){
        int j=s.length;
//c出现在s最后一位直接返回s.length
        if(c==s[j-1]){
            return j;
        }
//从目标串最后开始匹配
        for(int i=j ; i>0 ; i--){
            if(c == s[i-1]){
//平移到匹配位置
                return j-i;
            }
        }
//c不出现在目标串中时
        return j;
    }
    /**
     * 
     * @param p_str 源串
     * @param t_str 目标串
     * @return -1：错误的输入，-2：目标串和源串不匹配 ，n：匹配的位置在p_str下标为n的位置开始匹配
     */
    public static int index(String p_str ,String t_str){
        if(t_str.length()>p_str.length() || t_str==null || p_str==null){
            return -1;
        }
        char[] p_char = p_str.toCharArray();
        char[] t_char = t_str.toCharArray();
        int plen =p_char.length , tlen =t_char.length;
        int i=tlen , j;
        while(i<=plen){
            j=tlen;
//p_char[i-1]与t_char[j-1]若匹配，则进行下一组比较；反之离开循环。
            while(j > 0 && p_char[i - 1] == t_char[j - 1]){
                i--;
                j--;
            }
//完美匹配返回其开始匹配的位置
            if(j==0){
//如果要匹配多个，这里改为：int pos=i;i = i+tlen+1; --其中每次这个pos就是位置
                return i;
            }else{
// 把主串下标和模式串均向右滑动一段距离path(p_char[i-1]).即跳过path(p_char[i-1])个字符无需比较
                i = i + path(p_char[i - 1], t_char);
            }
        }
// 不满足while条件，模式串与主串无法匹配
        return -1;
    }

    public static void main(String[] args) {
        String p_str = "asdasdasdasqweqfazazazascvbnmklpiloldasdqweqwrwqr"; //为了测试，随便敲了段字符
        String t_str = "qwe";
        System.out.println(index(p_str,t_str));
    }
}

